<header>
    变量定义和赋值的时机相关理解
</header>
<p class="warn">
    温馨提示：严格模式不允许使用未声明的变量。
</p>
<p>
    var定义的变量会先定义，全部定义完毕再赋值。
</p>
<p>
    比如我们执行下面的语句：
</p>
<pre tag="javascript">
    console.log(temp);
</pre>
<p>
    你会看见如下报错：
</p>
<pre tag="javascript">
VM47:1 Uncaught ReferenceError: temp is not defined
at &lt;anonymous&gt;:1:13
</pre>
<p>
    我们把代码改一下：
</p>
<pre tag="javascript">
console.log(temp);
var temp='我爱你，中国！';
</pre>
<p>
    可以看见打印了```undefined```，没有报错，也没有打印```'我爱你，中国！'```。
</p>
<p>
    其实修改后的代码相当于：
</p>
<pre tag="javascript">
var temp;
console.log(temp);
temp='我爱你，中国！';
</pre>
<p>
    再看个例子：
</p>
<pre tag="javascript">
console.log(temp);
function temp(){}
var temp='我爱你，中国！';
</pre>
<p>
    看看对应结果：
</p>
<pre tag="javascript">
    ƒ temp(){}
</pre>
<p>
    这说明，和var一样，function定义的变量也会进行提升，都将被提到当前作用域的最顶部（但是不会初始化）；同时，函数声明的优先级大于变量声明的优先级（function>var）。
</p>